home *** CD-ROM | disk | FTP | other *** search
- XDEF __setjmp
- XDEF ___setjmp
- XDEF @_setjmp
- XDEF @__setjmp
- XDEF __longjmp
- XDEF @_longjmp
-
- XREF ___alloca_SP
- XREF __EPILOG
-
- csect text,0,,2,2
-
- __setjmp:
- ___setjmp:
- move.l 4(a7),a0 ; Get jmp_buf
- @_setjmp:
- @__setjmp:
- move.l (___alloca_SP).l,(a0)+ ; Save virtual SP
- move.l (a7),(a0)+ ; Save return address
- movem.l a2-a7/d2-d7,(a0) ; Save registers
- moveq #0,d0
- rts
-
- __longjmp:
- move.l 4(a7),a0 ; Get jmp_buf
- move.l 8(a7),d0 ; Get result
- @_longjmp:
- bne.s ok
- moveq #1,d0 ; Return must be != 0
- ok move.l (a0)+,(___alloca_SP).l ; Get virtual SP from setjmp call
- movem.l a0/d0,-(a7) ; Save jmp_buf and result
- addq.l #1,(___alloca_SP).l ; Increment virtual SP
- jsr __EPILOG ; Free alloca()ted memory (if any)
- movem.l (a7)+,a0/d0 ; Restore jmp_buf and result
- move.l (a0)+,a1 ; Get setjmp call return address
- movem.l (a0),a2-a7/d2-d7 ; Get registers
- addq.l #4,a7 ; Pop own return address
- jmp (a1) ; And return to setjmp call
-
- end
-